www.gusucode.com > matlab从零到进阶程序与数据 > matlab从零到进阶程序与数据/第20章 多项式拟合与数据插值/lagrange.m

    function y = lagrange(x0,y0,x)
% 拉格朗日多项式插值的MATLAB函数
% y = lagrange1(x0,y0,x) 返回x处的拉格朗日多项式插值y,输入参数x0和y0为等长向量,
%            用来指定型值点坐标。输入参数x用来指定插值点坐标,可以是向量或标量。
% CopyRight  xiezhh(谢中华)  2012.2.12

% 判断原始坐标点是否等长
if numel(x0) ~= numel(y0)
    error('原始坐标点应等长')
end
x0 = x0(:);  % 将x0拉长为长向量
% 判断插值节点是否有重复值
if any(diff(sort(x0))==0)
    error('插值节点不能有重复值')
end

n = numel(x0);  % 插值节点个数
m = numel(x);  % 插值点个数
y0 = y0(:);  % 将y0拉长为长向量
x = x(:)';  % 将x拉长为长向量,然后转置
y = zeros(n,m);  % 生成n行,m列的零矩阵
% 通过循环求拉格朗日插值多项式
for i = 1:n
    y(i,:) = y0(i)*prod(repmat(x,n-1,1)-...
        repmat(x0(1:n~=i),1,m))/prod(x0(i)-x0(1:n~=i));
end
y = sum(y);  % 求和